package cc.devclub.ftd.thread.create;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Java默认提供了五种线程池，通过Executors创建，分别为：
 * <p>
 * newCachedThreadPool 创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
 * <p>
 * newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。
 * <p>
 * newScheduledThreadPool创建一个定长线程池，支持定时及周期性任务执行。
 * <p>
 * newSingleThreadExecutor 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
 * <p>
 * newWorkStealingPool 创建一个具有抢占式操作的线程池，由于能够合理的使用CPU进行对任务操作（并行操作），所以适合使用在很耗时的任务中。
 * <p>
 * 演示场景：售票员售票
 *
 * @Author: 【我是开发者FTD】公众号 微信号：ForTheDevelopers
 */
public class MyThreadPool implements Runnable {

    // 总票数
    public int count = 10;

    @Override
    public void run() {
        // 当还有票时就继续售卖
        while (count > 0) {
            // 剩余票数
            count--;
            System.out.println(
                    Thread.currentThread().getName() + "售卖第 " + (10 - count) + " 张票,当前剩余票数: " + count);
        }
    }

    public static void main(String[] args) {
        ExecutorService ex = Executors.newFixedThreadPool(5);
        MyThreadPool t = new MyThreadPool();
        ex.submit(t);
        ex.shutdown();
    }
}